/*
 * Socket.cpp
 *
 */

#include <cstdio>
#include "Socket.h"
#include "../common/StringUtils.h"

namespace ipc {

Socket::Socket():m_Fd(-1)
{
}

Socket::Socket(int fd):m_Fd(fd)
{
}

Socket::~Socket()
{
	close();
}

void Socket::send(void *datos, size_t tamanio)
{
	int enviados;			//Cantidad de bytes enviados.
	int ult_envio;			// Cantidad de bytes enviados en el último envío.
	size_t nbytes = tamanio;

	if(m_Fd <0)
		throw Exception("No se abrio el socket");

	// Envía los datos.
	enviados = 0;
	while(nbytes)
	{
		ult_envio = write(m_Fd, ((unsigned char *) datos) + enviados,
				nbytes);

		if (ult_envio <= 0)
			throw Exception("Error al leer del socket");

		enviados += ult_envio;
		nbytes -= ult_envio;
	}

	if(enviados<tamanio)
		throw Exception("No se pudo escribir el tamanio solicitado del socket");
}

void Socket::receive(void *datos, size_t tamanio)
{
	int ult_lec;		// Cantidad de bytes leidos en la ultima lectura.
	int leidos;			// Cantidad de bytes leidos.
	size_t nbytes=tamanio;

	//Lee
	leidos = 0;

	while(nbytes)
	{
		ult_lec = ::read(m_Fd, ((unsigned char *) datos) + leidos,
				nbytes);

		if (ult_lec <= 0)
			throw Exception("Error al leer del socket");

		leidos += ult_lec;
		nbytes -= ult_lec;
	}

	if(leidos<tamanio)
		throw Exception("No se pudo leer el tamanio solicitado del socket");
}

int Socket::getFd()
{
	return m_Fd;
}

void Socket::close()
{
	if(m_Fd > 0)
		::close(m_Fd);
	m_Fd=-1;
}

} /* namespace IPC */
